﻿using Quartz;
using Quartz.Impl;
using System;
using YiSha.Util;

namespace YiSha.Business.AutoJob
{
    /// <summary>
    /// Quartz调度器管理器（单例模式）
    /// 确保全局只有一个调度器实例，统一管理所有定时任务
    /// </summary>
    public class JobScheduler
    {
        // 线程安全锁
        private static readonly object _lock = new object();
        // 静态调度器实例（单例）
        private static IScheduler _scheduler;

        /// <summary>
        /// 获取全局唯一的调度器实例
        /// </summary>
        /// <returns>Quartz调度器</returns>
        public static IScheduler GetScheduler()
        {
            // 双重校验锁：确保线程安全且只初始化一次
            if (_scheduler == null)
            {
                lock (_lock)
                {
                    if (_scheduler == null)
                    {
                        try
                        {
                            // 1. 初始化调度器工厂（使用默认配置，可自定义quartz.config修改线程池等参数）
                            ISchedulerFactory factory = new StdSchedulerFactory();

                            // 2. 获取调度器实例（同步等待，确保初始化完成）
                            // 注意：生产环境若初始化耗时较长，可改为异步方法GetSchedulerAsync并等待
                            _scheduler = factory.GetScheduler().GetAwaiter().GetResult();
                        }
                        catch (Exception ex)
                        {
                            // 抛出异常，避免返回null导致后续操作出错
                            throw new InvalidOperationException("无法初始化Quartz调度器，请检查配置和日志", ex);
                        }
                    }
                }
            }
            return _scheduler;
        }

        /// <summary>
        /// 确保调度器已启动（如果未启动则启动）
        /// </summary>
        public static void EnsureStarted()
        {
            var scheduler = GetScheduler();
            if (!scheduler.IsStarted)
            {
                try
                {
                    scheduler.Start().GetAwaiter().GetResult();
                }
                catch (Exception ex)
                {
                    LogHelper.Error("启动Quartz调度器失败：", ex);
                    throw;
                }
            }
        }

        /// <summary>
        /// 关闭调度器（应用关闭时调用）
        /// </summary>
        public static void Shutdown()
        {
            if (_scheduler != null && !_scheduler.IsShutdown)
            {
                try
                {
                    // 等待所有正在执行的任务完成后再关闭（参数：是否等待完成）
                    _scheduler.Shutdown(true).GetAwaiter().GetResult();
                }
                catch (Exception ex)
                {
                    LogHelper.Error("关闭Quartz调度器失败：", ex);
                }
                finally
                {
                    _scheduler = null; // 重置单例，下次获取将重新初始化
                }
            }
        }
    }
}
